package com.rv.nats.resolver.param;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.rv.nats.annotation.Payload;
import io.nats.client.Message;

import java.io.IOException;
import java.lang.reflect.Parameter;

/**
 * @author sundez
 * @version 1.1.4.8
 * @since 2025/6/12
 *    负载参数解析器
 *     用于解析方法参数中带有{@link Payload}注解的参数
 *     该注解用于指定方法参数为负载参数
 */
public class PayloadParameterResolver implements ParameterResolver{

    private ObjectMapper mapper = new ObjectMapper();

    public PayloadParameterResolver() {
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }

    /**
     * 判断当前解析器是否支持对parameter的解析
     *
     * @param parameter 方法中反射的参数
     * @return 是否支持
     */
    @Override
    public boolean support(Parameter parameter) {
        if (parameter.getType() == Message.class) {
            return false;
        }
        return parameter.isAnnotationPresent(Payload.class) || parameter.getAnnotations().length == 0;
    }

    /**
     * 将message中的数据进行解析然后再返回
     *
     * @param message   {@link Message}
     * @param parameter {@link Parameter}
     * @return 解析后的数据
     */
    @Override
    public Object resolve(Message message, Parameter parameter) {
        byte[] data = message.getData();
        if (data == null || data.length == 0) {
            return null;
        }
        JavaType javaType = mapper.getTypeFactory().constructType(parameter.getType());
        try {
            return mapper.readValue(data, javaType);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
